package main

import "fmt"

/*
队列是先进先出的数据结构
*/

type Queue[T interface{}] struct {
	elements []T
}

func (q *Queue[T]) Put(value T) {
	q.elements = append(q.elements, value)
}

func (q *Queue[T]) Pop() (T, bool) {
	var value T
	if len(q.elements) == 0 {
		return value, true
	}
	value = q.elements[0] // 把最先进来的，即下标为0的元素从slice弹出
	q.elements = q.elements[1:]
	return value, len(q.elements) == 0

}

func (q Queue[T]) Size() int {
	return len(q.elements)
}

func main() {

	var q1 Queue[int] // 实例化了一个 队列内元素为 int 类型的队列
	q1.Put(1)
	q1.Put(1)
	q1.Put(1)
	q1.Put(100)
	fmt.Println(q1.Pop())
	fmt.Println(q1.Pop())
	fmt.Println(q1.Pop())
	fmt.Println(q1.Pop())
	fmt.Println(q1.Pop())

	var q2 Queue[[]int]
	q2.Put([]int{1, 2, 3})
	q2.Put([]int{100, 1000})
	fmt.Println(q2.Pop())
}
